package com.bravo.rxlib;


/**
 * Created by bravo.lee on 2017/10/8.
 * 与外界交互的核心类。
 */

public class Observable<T> {

    private OnSubscriable<T> onSubscriable;

    private Observable(OnSubscriable<T> onSubscriable) {
        this.onSubscriable = onSubscriable;
    }

    public  static <T> Observable<T> create(OnSubscriable<T> onSubscriable) {
        return new Observable<>(onSubscriable);
    }

    /**
     * 1.为1层调用，未调用map()方法时，调用的是MainActivity的接口方法。
     * 2.如果调用了map()方法，则 call 调用的是 OnSubscriableLift ( extends OnSubscriable) 中的 call 方法。
     * @param subscriable
     */
    public void subscriable(Subscriable<? super T> subscriable) {
        onSubscriable.call(subscriable);
    }

    public Observable<T> subscriableIo(){
        return create(new OnSubscriableOnIo<T>(onSubscriable));
    }

    public Observable<T> subscriableMain(){
        return create(new OnSubscriableMain<T>(onSubscriable));
    }

    /**
     * 调用map方法  创建了一个新的Observable。
     * @param func  传入事件转换的方法对象 func
     * @param <R> 要将T 转为 R
     * @return  返回Observable 以供链式调度。
     */
    public <R> Observable<R> map(Func<? super T, ? extends R> func) {
        return lift(new OperatorMap<T,R>(func));
    }

    /**
     *
     * @param trOperatorMap  持有Func对象的具体实现类。
     * @param <R> 要将T 转为 R
     * @return
     *
     * OnSubscriableLift 新Observable 的
     */
    private <R> Observable<R> lift(OperatorMap<T, R> trOperatorMap) {
        return new Observable<>(new OnSubscriableLift<>(onSubscriable,trOperatorMap));
    }
}
